package com.demo.batch.schedule;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.demo.service.BatchJnlService;

//定时器类要交给Srping容器纳管
@Component
public class SimpleBatchFileTask {
	
	@Autowired
	private BatchJnlService batchJnlService ;
	
	/**
	 *  多线程定时任务
	 *  【说明】：因为多线程，不用等到15秒即可开始下一个任务，直到线程池满（maxPoolSize + queueCapacity）
	 *  【Q1】：触发器的时间，若跟其他任务（如单线程任务）相同，还是会等其他任务结束才会开始
	 *  【A1】：针对上述问题，可以新增多个异步线程池，将批量任务分别放入各自异步线程池中，可令主线程中快速结束，避免任务之间堵塞。
	 */
	@Async	//将方法异步化
	@Scheduled(cron = "40 47 14 * * ?")
	public void batchFileProcess() {
		long startTime = System.currentTimeMillis() ;
		System.out.println("SimpleBatchFileTask begin....");
		// 1.读取文件内容
		File file = new File("D:\\Eclipse\\eclipse-workspace\\SpringBoot-BatchFile\\BatchTest.txt") ;
		List<String[]> contentList = this.readFile(file) ;
		
		// 2.数据处理
		List<Map> newContentList = this.processData(contentList) ;
		
		// 3.数据入库
		Integer count = this.batchJnlService.saveBatchJnl(newContentList) ;
		
		System.out.println("SimpleBatchFileTask end! count:"+ count +", on time:" + (System.currentTimeMillis() - startTime));
	}

	/**
	 * 	读取数据文件内容
	 * @param file	数据文件对象
	 * @return	数据List，数据Item为每一行文本根据“|”分割后的数组
	 */
	public List<String[]> readFile(File file) {
		List<String[]> dataList = new ArrayList<String[]>() ;
		BufferedReader reader = null ;
		try {
			reader = new BufferedReader(new FileReader(file)) ;
			String dataStr = null ;
			while((dataStr = reader.readLine()) != null) {
				String[] dataArray = dataStr.split("\\|") ;
				if(6 != dataArray.length) {
					// 格式不正确，则抛错，暂且输出日志
					System.out.println("Data Error");
					return null;
				}
				dataList.add(dataArray) ;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return dataList ;
	}
	
	/**
	 * 	处理数据（将每行数据中的金额，都乘以100）
	 * @param contentList
	 * @return	数据List，数据Item为处理后的Map对象
	 */
	private List<Map> processData(List<String[]> contentList) {
		List<Map> resultList = new ArrayList<Map>() ;
		for(String[] dataArray : contentList) {
			Map dataMap = new HashMap() ;
			dataMap.put("id", dataArray[0]) ;
			BigDecimal amount1 = new BigDecimal(dataArray[1]).multiply(new BigDecimal("100")) ;
			dataMap.put("amount1", amount1.toString()) ;
			BigDecimal amount2 = new BigDecimal(dataArray[2]).multiply(new BigDecimal("100")) ;
			dataMap.put("amount2", amount2.toString()) ;
			BigDecimal amount3 = new BigDecimal(dataArray[3]).multiply(new BigDecimal("100")) ;
			dataMap.put("amount3", amount3.toString()) ;
			BigDecimal amount4 = new BigDecimal(dataArray[4]).multiply(new BigDecimal("100")) ;
			dataMap.put("amount4", amount4.toString()) ;
			BigDecimal amount5 = new BigDecimal(dataArray[5]).multiply(new BigDecimal("100")) ;
			dataMap.put("amount5", amount5.toString()) ;
			
			resultList.add(dataMap) ;
		}
		return resultList;
	}

}
